import { defineStore } from 'pinia'
import { SelfStorage } from '@/utils/secure-ls.ts'
import maintenance from '@/api/modules/maintenance.ts'
import { formatLang } from '@/utils/locale.ts'
import * as localeList from 'element-plus/es/locale/index'

// 导入i18n实例
import { getCurrentInstance } from 'vue'
import type { I18n } from 'vue-i18n'

interface SysGlobalModel {
    sysIsMobile: boolean
    sysLayout: string
    sysLang: string
    sysColor: string
    sysDark: boolean
    sysMenuIsCollapse: boolean
    sysMenuUniqueOpened: boolean
    sysLayoutTags: boolean
    sysAutoExit: number
}

export const useSysGlobalStore = defineStore('sysGlobal', {
    state(): SysGlobalModel {
        return {
            // 移动端布局
            sysIsMobile: false,
            // 布局 [默认-default | 通栏-header | 经典-menu | 功能坞-dock（将关闭标签和面包屑栏）]
            sysLayout: 'default',
            // 语言，默认中文zh-cn,英文en
            sysLang: 'zh-cn',
            // 主题颜色
            sysColor: '#409EFF',
            // 暗黑模式
            sysDark: false,
            // 菜单是否折叠 toggle
            sysMenuIsCollapse: false,
            // 菜单是否只保持一个子菜单的展开
            sysMenuUniqueOpened: false,
            // 多标签栏
            sysLayoutTags: true,
            // 自动登出时间
            sysAutoExit: 0
        }
    },
    getters: {
        // 修复：更稳定地获取i18n实例
        i18nInstance(): I18n {
            // 优先从window获取（全局注入的实例）
            if (window.i18nInstance) {
                return window.i18nInstance
            }
            // 从组件实例获取
            const instance = getCurrentInstance()?.appContext.config.globalProperties.$i18n
            if (instance) {
                return instance as I18n
            }
            // 避免返回undefined，强制报错提示
            throw new Error('i18n实例未初始化，请检查main.ts中的配置')
        }
    },
    actions: {
        set<T extends keyof SysGlobalModel>(key: T, value: SysGlobalModel[T]) {
            Object.assign(this.$state, {
                [key]: value
            })
        },

        // 获取语言包
        async getLang() {
            try {
                const data = await maintenance.langTranslation.json.get()
                // 不覆盖用户已选择的语言，而是以用户选择的 sysLang 为准
                const targetLang = this.sysLang || data.langFlag // 优先用用户选择的语言

                const appLang = targetLang.toLowerCase()
                const langTranslation = data.langTranslation

                // 获取 element-plus 对应语言的消息
                const esLang = formatLang(appLang)
                const elMessages = (localeList as any)[esLang] || {}

                // 获取i18n实例
                const i18n = this.i18nInstance
                if (!i18n) {
                    console.error('i18n instance not found')
                    return
                }

                // 1. 将语言包注册到 i18n 实例
                i18n.global.setLocaleMessage(targetLang, {
                    ...elMessages, // element 组件翻译
                    ...langTranslation // 业务翻译
                })

                // 2. 更新 i18n 的当前语言
                i18n.global.locale = targetLang

                // 3. 仅存储当前语言标识，无需存储完整语言包
                this.sysLang = targetLang

                return targetLang
            } catch (error) {
                console.error('Failed to load language:', error)
                // 出错时使用默认语言
                this.sysLang = 'zh-cn'
                return 'zh-cn'
            }
        }
    },
    persist: {
        key: 'SYS_GLOBAL',
        storage: SelfStorage,
        pick: [
            'sysLayout',
            'sysLang',
            'sysColor',
            'sysDark',
            'sysMenuIsCollapse',
            'sysMenuUniqueOpened',
            'sysLayoutTags',
            'sysAutoExit'
        ]
    }
})
